package city.spring.modules.medicine.service.impl;

import city.spring.modules.medicine.entity.MedicinewarehousingEntity;
import city.spring.modules.medicine.entity.MedicinewarehousingMedicineExtEntity;
import city.spring.modules.medicine.repository.MedicinewarehousingMedicineExtRepository;
import city.spring.modules.medicine.repository.MedicinewarehousingRepository;
import city.spring.modules.medicine.service.MedicineService;
import city.spring.modules.medicine.service.MedicinewarehousingService;
import city.spring.modules.medicine.vo.MedicinewarehousingVO;
import city.spring.modules.system.entity.UserEntity;
import city.spring.modules.system.service.UserService;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.security.Principal;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Service：药品入库信息
 *
 * @author 谢金婷
 * @date 2020-06-24 15:09:27
 */
@CacheConfig(cacheNames = {MedicinewarehousingServiceImpl.CACHE_NAME})
@Transactional(rollbackFor = Throwable.class)
@Service
public class MedicinewarehousingServiceImpl extends ServiceImpl<MedicinewarehousingRepository, MedicinewarehousingEntity> implements MedicinewarehousingService {

    private static final Logger logger = LoggerFactory.getLogger(MedicinewarehousingServiceImpl.class);

    private final MedicineService medicineService;
    private final MedicinewarehousingRepository medicinewarehousingRepository;
    private final MedicinewarehousingMedicineExtRepository warehousingShelfExtRepository;
    private final UserService userService;

    public MedicinewarehousingServiceImpl(MedicineService medicineService, MedicinewarehousingRepository medicinewarehousingRepository, MedicinewarehousingMedicineExtRepository warehousingShelfExtRepository, UserService userService) {
        this.medicineService = medicineService;

        this.medicinewarehousingRepository = medicinewarehousingRepository;
        this.warehousingShelfExtRepository = warehousingShelfExtRepository;
        this.userService = userService;
    }

    @Override
    public void saveMedicinewarehousing(MedicinewarehousingEntity entity, @NonNull Principal user) {

//        MedicineEntity medicineEntity = medicineService.getById(String.valueOf(entity.getMedicineId()));

        /**
         * 入库信息
         */
        // 所属类别
//        entity.setCategory(medicineEntity.getCategory());
        //设置经办人为的当前用户
        UserEntity userEntity = userService.getUserByIdOrAccount(user.getName());
        entity.setUserId(userEntity.getId());


//        // 获取入库药品信息
//        MedicineEntity medicineEntity = medicineService.getById(String.valueOf(entity.getMedicineId()));
//        System.out.println(entity.getMedicineId());
//        System.out.println(medicineEntity);
//
//        logger.info("当前药品信息：{}", medicineEntity);
//        logger.info("货架ID判断：{}", entity.getShelfId().equals(medicineEntity.getShelfId()));
//        logger.info("条件1：{}", medicineEntity.getStorehouseId() != null
//                && medicineEntity.getShelfId().equals(entity.getShelfId()));
//        logger.info("条件2：{}", medicineEntity.getStorehouseId() != null
//                && !medicineEntity.getShelfId().equals(entity.getShelfId()));
//        logger.info("条件3：{}", medicineEntity.getStorehouseId() == null);
//        logger.info("entity.getShelfId()：{}", entity.getShelfId());
//        logger.info("medicineEntity.getShelfId()：{}", medicineEntity.getShelfId());
//
////        1. 药品非第一次入库，货架相等
//        if (medicineEntity.getStorehouseId() != null && medicineEntity.getShelfId().equals(entity.getShelfId())) {
//
//            /**
//             * 入库单信息
//             */
//            //药品id
//            entity.setMedicineId(medicineEntity.getId());
//            //仓库id
//            entity.setStorehouseId(medicineEntity.getStorehouseId());
//            //经办人
//            StorehouseEntity storehouseEntity = storehouseService.getById(medicineEntity.getStorehouseId());
//            entity.setUserId(storehouseEntity.getUserId());
//            //货架
//            entity.setShelfId(medicineEntity.getShelfId());
//            // 剂量单位
//            entity.setUnitmeasurement(medicineEntity.getDosageunit());
//            //价格
//            entity.setUnitprice(medicineEntity.getUnitprice());
//            //计量数量=入库数量*转换关系
//            entity.setUnitMeasurementAmount(entity.getWarehousingAmount().multiply(entity.getRelationship()));
//            //总金额=计量数量*价格
//            entity.setTotal(entity.getUnitMeasurementAmount().multiply(entity.getUnitprice()));
//            //入库类型
////            entity.setStoragetype("药品");
//            //生产日期、有效期
//            entity.setProductiondate(medicineEntity.getProductiondate());
//            entity.setExpirationdate(medicineEntity.getExpirationdate());
//            //生产厂商
//            entity.setManufacturer(medicineEntity.getManufacturer());
//            //供应商
//            entity.setSupplierId(medicineEntity.getSupplierId());
//            //规格
//            entity.setSpecifications(medicineEntity.getSpecifications());
//            //类型
//            entity.setType(medicineEntity.getType());
//
//            /**
//             * 更新药品信息
//             */
//            //入库数量=原入库数量+计量数量
//            medicineEntity.setWarehousingquantity(medicineEntity.getWarehousingquantity().add(entity.getUnitMeasurementAmount()));
//            //库存=原库存+计量数量
//            medicineEntity.setQuantity(medicineEntity.getQuantity().add(entity.getUnitMeasurementAmount()));
//
//            medicineService.updateMedicine(medicineEntity);
//
//
//            // 2. 药品非第一次入库，货架不相等，新增药品记录
//        } else if (medicineEntity.getStorehouseId() != null
//                && !medicineEntity.getShelfId().equals(entity.getShelfId())) {
//            /**
//             * 入库记录
//             */
//            //仓库
//            entity.setStorehouseId(medicineEntity.getStorehouseId());
//            //经办人
//            StorehouseEntity storehouseEntity = storehouseService.getById(medicineEntity.getStorehouseId());
//            entity.setUserId(storehouseEntity.getUserId());
//            //药品
//            entity.setMedicineId(medicineEntity.getId());
//            //计量单位=入库数量*转换关系
//            entity.setUnitMeasurementAmount(entity.getWarehousingAmount().multiply(entity.getRelationship()));
//            //计量单位=剂量单位
//            entity.setUnitmeasurement(medicineEntity.getDosageunit());
//            //总金额=计量数量*价格
//            entity.setTotal(entity.getUnitMeasurementAmount().multiply(entity.getUnitprice()));
//            //生产日期、有效期
//            entity.setProductiondate(medicineEntity.getProductiondate());
//            entity.setExpirationdate(medicineEntity.getExpirationdate());
//            //生产厂商
//            entity.setManufacturer(medicineEntity.getManufacturer());
//            //供应商
//            entity.setSupplierId(medicineEntity.getSupplierId());
//            //规格
//            entity.setSpecifications(medicineEntity.getSpecifications());
//            //类型
//            entity.setType(medicineEntity.getType());
//
//            /**
//             * 新增药品记录
//             */
//            MedicineEntity medicineEntity1 = new MedicineEntity();
//            medicineEntity1.setName(medicineEntity.getName());
//            medicineEntity1.setStorehouseId(medicineEntity.getStorehouseId());
//            medicineEntity1.setCategory(medicineEntity.getCategory());
//            medicineEntity1.setSpecifications(medicineEntity.getSpecifications());
//            medicineEntity1.setUnit(medicineEntity.getUnit());
//            medicineEntity1.setUnitprice(medicineEntity.getUnitprice());
//            medicineEntity1.setDosageunit(medicineEntity.getDosageunit());
//            medicineEntity1.setManufacturer(medicineEntity.getManufacturer());
//            medicineEntity1.setType(medicineEntity.getType());
//            medicineEntity1.setDescription(medicineEntity.getDescription());
//            medicineEntity1.setWarehousingquantity(entity.getUnitMeasurementAmount());
//            medicineEntity1.setQuantity(entity.getUnitMeasurementAmount());
//            medicineEntity1.setProductiondate(medicineEntity.getProductiondate());
//            medicineEntity1.setExpirationdate(medicineEntity.getExpirationdate());
//            medicineEntity1.setIswarehouse(medicineEntity.getIswarehouse());
//            medicineEntity1.setShelfId(entity.getShelfId());
//            medicineService.save(medicineEntity1);
//            HttpHeaders headers = new HttpHeaders();
//            headers.add(HttpHeaders.LOCATION, String.valueOf(medicineEntity.getId()));
//
//            // 3.药品第一次入库
//        } else if (medicineEntity.getStorehouseId() == null) {
//            /**
//             * 入库单信息
//             */
//            //设置药品id
//            entity.setMedicineId(medicineEntity.getId());
//            // 设置剂量单位
//            entity.setUnitmeasurement(medicineEntity.getDosageunit());
//            //设置经办人为仓库管理员
//            String storehouseId = entity.getStorehouseId();
//            StorehouseEntity storehouseEntity = storehouseService.getById(storehouseId);
//            entity.setUserId(storehouseEntity.getUserId());
//            //计量数量=入库数量*转换关系
//            entity.setUnitMeasurementAmount(entity.getWarehousingAmount().multiply(entity.getRelationship()));
//            //总金额=计量数量*价格
//            entity.setTotal(entity.getUnitMeasurementAmount().multiply(entity.getUnitprice()));
//            /**
//             * 更新药品信息
//             */
//            //仓库id
//            medicineEntity.setStorehouseId(entity.getStorehouseId());
//            //货架
//            medicineEntity.setShelfId(entity.getShelfId());
//            //规格型号
//            medicineEntity.setSpecifications(entity.getSpecifications());
//            //类型
//            medicineEntity.setType(entity.getType());
//            // 单价=入库单价
//            medicineEntity.setUnitprice(entity.getUnitprice());
//            //入库数量=计量数量
//            medicineEntity.setWarehousingquantity(entity.getUnitMeasurementAmount());
//            // 库存数量=计量数量
//            medicineEntity.setQuantity(entity.getUnitMeasurementAmount());
//            //生产日期、有效期
//            medicineEntity.setProductiondate(entity.getProductiondate());
//            medicineEntity.setExpirationdate(entity.getExpirationdate());
//            //标记已入库
//            medicineEntity.setIswarehouse(1);
//            // 生产厂家
//            medicineEntity.setManufacturer(entity.getManufacturer());
//            //供应商
//            medicineEntity.setSupplierId(entity.getSupplierId());
//
//            medicineService.updateMedicine(medicineEntity);
//
//        }


        if (!save(entity)) {
            throw new RuntimeException("保存信息失败");
        }
    }

    @Override
    public void updateMedicinewarehousing(MedicinewarehousingEntity entity) {
        // 使用 updateById(entity); 修改数据时，将会修改 entity 对象中所有非null数据，如果某个字段为null，将会忽略该字段的修改
        boolean update = updateById(entity);
        if (!update) {
            throw new RuntimeException("修改信息失败");
        }
    }

    @Override
    public void deleteMedicinewarehousing(String primaryKey) {
        removeById(primaryKey);
        List<MedicinewarehousingMedicineExtEntity> medicinewarehousingShelfs = warehousingShelfExtRepository.getByWarehousingId(primaryKey);
        System.out.println("medicinewarehousingShelfs" + medicinewarehousingShelfs);
        if (!medicinewarehousingShelfs.isEmpty()) {
            List<String> medicinewarehousingShelfId = medicinewarehousingShelfs.stream().map(MedicinewarehousingMedicineExtEntity::getId).collect(Collectors.toList());
            warehousingShelfExtRepository.deleteBatchIds(medicinewarehousingShelfId);
        }
    }

    @Override
    public void deleteMedicinewarehousing(List<String> primaryKeys) {
        removeByIds(primaryKeys);
    }

    @Override
    public MedicinewarehousingEntity getById(String id) {
        return medicinewarehousingRepository.getById(id);
    }

    @Override
    public MedicinewarehousingVO getShelflevelWarehousingById(String id) {
        MedicinewarehousingEntity warehousingEntity = medicinewarehousingRepository.getById(id);
        System.out.println("warehousingEntity" + warehousingEntity);
        MedicinewarehousingVO warehousingVO = new MedicinewarehousingVO(warehousingEntity);

        // 加载货架层次列表
        warehousingVO.setShelflevels(warehousingShelfExtRepository.getWarehousingShelflevels(id));

        return warehousingVO;
    }

    @Override
    public IPage<MedicinewarehousingVO> listPage(Page<? extends MedicinewarehousingEntity> page, Wrapper<? extends MedicinewarehousingEntity> wrapper) {
        return baseMapper.listPage(page, wrapper);
    }
}